package wangwenjun.phase2.concurrencypattern.readwritelockseparation.demo01.framework;

/**
 * ReadWriteLockFactory 虽然名字中有lock ，但是它并不是lock ，它主要是用于创建read lock和write lock 的，
 * 并且提供了查询功能用于查询当前有多少个reader 和writer 以及waiting中的writer ，
 *
 * 如果reader 的个数大于0 ，那就意味着writer 的个数等于0 ，
 * 反之writer 的个数大于0 （事实上writer 最多只能为1 ），则reader 的个数等于0,
 * 由于读和写，写和写之间都存在着冲突，因此这样的数字关系也就不奇怪了
 *
 * @author ChangLiang
 * @date 2020/6/12
 */
public interface ReadWriteLockFactory {

    /**
     * 创建reader 锁
     * @return
     */
    Lock getReadLock();

    /**
     * 创建write 锁
     * @return
     */
    Lock getWriteLock();

    /**
     * 获取当前有多少线程正在执行写操作 最多是1个
     * @return 数量
     */
    int getWritingWriters();

    /**
     * 获取当前有多少线程正在等待获取写入锁 而导致阻塞
     * @return 数量
     */
    int getWaitingWriters();

    /**
     * 获取当前有多少个线程正在进行读的操作
     * @return
     */
    int getReadingReaders();

    /**
     * 工厂方法，创建ReadWriteLockFactory
     * @return
     */
    static ReadWriteLockFactory createReadWriteLock() {
        return new ReadWriteLockFactoryImpl();
    }

    /**
     * 工厂方法，创建ReadWriteLockFactory ， 并且传入preferWriter
     * @param preferWriter
     * @return
     */
    static ReadWriteLockFactory createReadWriteLock(boolean preferWriter) {
        return new ReadWriteLockFactoryImpl(preferWriter);
    }
}
